import Decimal from 'decimal.js';

/** 渲染卡片中的数字和单位 */
export const renderColumnNum = (num: number | string) => {
    const itemNumber = Number(num);

    // 处理返回的不是数字类型的情况
    if (Number.isNaN(itemNumber)) {
        return { num };
    }

    // 获取数字的单位
    const [numberUnit, numberUnitLength] = getUnit(itemNumber);
    // 判断是否为整数
    const isInt = Number.parseInt(`${itemNumber}`) === itemNumber;
    // 检查数组保留两位小数后的字符串数量
    const numberLength = `${(itemNumber * 100) | 0}`.length;

    /**
     * 7: 浮点型的 * 100 的长度， 7是10万
     * 9: 整数 * 100类型的长度, 9是百万
     */
    let formatLength = 7;

    // 整数的情况下从百万开始，浮点型数字从10万开始,
    if (isInt) {
        formatLength = 9;
    }

    // 获取换算之后的保留两位小数的值。（解决直接使用toFixed的精度丢失的问题）、
    // value = (((x / y) * 100) => 转化为整数) * 100 好像大概是这么个意思.
    const num1 = +Decimal.div(itemNumber, numberUnitLength ?? 1);
    const num2 = Number.parseInt(`${Decimal.mul(num1, 100)}`);
    const floatNum = +Decimal.div(num2, 100);
    // 计算换算之后的值
    const numString = numberUnitLength ? floatNum.toFixed(2) : itemNumber;
    if (numberLength >= formatLength) {
        return {
            unit: numberUnit,
            num: numString
        };
    }

    return {
        unit: undefined,
        num: itemNumber
    };
};

/**
 * 返回数字的单位，只有万和亿
 * @param number 数字
 * @returns {Array} [单位，计量的数字.例如：输入12344，返回10000;]
 */
const getUnit = (number: number) => {
    // 如果大于1亿返回亿
    if (number >= 100000000) {
        return ['亿', 100000000];
    }

    // 如果大于10万，则返回万
    if (number > 100000) {
        return ['万', 10000];
    }

    return [];
};
